리소스 접근하기
MCP의 리소스 기능을 사용하면 서버가 정보 접근을 위한 도구 호출 없이도 데이터를 프롬프트에 직접 포함할 수 있도록 노출할 수 있습니다. 이를 통해 Claude와 같은 AI 모델에 컨텍스트를 더욱 효율적으로 제공할 수 있습니다.
리소스 요청 이해하기
MCP 서버에 리소스를 정의한 후에는 클라이언트가 이를 요청하고 사용할 방법이 필요합니다. 클라이언트는 애플리케이션과 MCP 서버 사이의 가교 역할을 하며, 통신과 데이터 파싱을 자동으로 처리합니다.
흐름은 간단합니다. 사용자가 "@report.pdf"와 같이 문서를 참조하려 할 때, 애플리케이션은 MCP 클라이언트를 사용해 서버에서 해당 리소스를 가져와 Claude에 전송되는 프롬프트에 직접 포함시킵니다.
리소스 읽기 구현하기
핵심 기능은 MCP 클라이언트에 read_resource 함수를 구현하는 것입니다. 이 함수는 가져올 리소스를 식별하는 URI 매개변수를 받습니다:
async def read_resource(self, uri: str) -> Any:
result = await self.session().read_resource(AnyUrl(uri))
resource = result.contents[0]
MCP 서버의 응답에는 contents 목록이 포함됩니다. 일반적으로 첫 번째 요소만 필요하며, 이 요소에는 MIME 타입과 같은 메타데이터와 함께 실제 리소스 데이터가 담겨 있습니다.
다양한 콘텐츠 타입 처리하기
리소스는 다양한 유형의 콘텐츠를 반환할 수 있으므로, 클라이언트는 이를 적절히 파싱해야 합니다. MIME 타입을 통해 데이터 처리 방법을 확인할 수 있습니다:
if isinstance(resource, types.TextResourceContents):
if resource.mimeType == "application/json":
return json.loads(resource.text)
return resource.text
이 방식을 사용하면 JSON 리소스는 Python 객체로 올바르게 파싱되고, 일반 텍스트 리소스는 문자열로 반환됩니다. MIME 타입은 올바른 파싱 전략을 결정하는 힌트 역할을 합니다.
필요한 임포트
이 기능이 제대로 작동하려면 MCP 클라이언트에 다음 임포트가 필요합니다:
import json
from pydantic import AnyUrl
json 모듈은 JSON 응답 파싱을 처리하고, AnyUrl은 URI 매개변수의 올바른 타입 처리를 보장합니다.
리소스 접근 테스트하기
구현이 완료되면 CLI 애플리케이션을 통해 기능을 테스트할 수 있습니다. "@report.pdf 문서에 무엇이 있나요?"와 같이 입력하면 시스템은 다음을 수행해야 합니다:
- 자동완성 목록에 사용 가능한 리소스 표시
- 리소스 선택 허용
- 리소스 콘텐츠 자동 가져오기
- 해당 콘텐츠를 Claude에 전달하는 프롬프트에 포함
핵심 장점은 Claude가 프롬프트에서 문서 콘텐츠를 직접 받기 때문에 정보 접근을 위한 도구 호출이 필요 없다는 것입니다. 이를 통해 상호작용이 더 빠르고 효율적으로 이루어집니다.
애플리케이션과의 통합
작성한 MCP 클라이언트 코드는 애플리케이션의 다른 부분에서도 사용됩니다. read_resource 함수는 다른 컴포넌트가 문서 콘텐츠 가져오기, 사용 가능한 리소스 목록 조회, 또는 리소스 데이터를 프롬프트에 통합하는 데 활용할 수 있는 기본 구성 요소가 됩니다.
이러한 관심사의 분리는 코드를 깔끔하게 유지시켜 줍니다. MCP 클라이언트는 서버와의 통신을 담당하고, 애플리케이션 로직은 해당 데이터를 효과적으로 활용하는 방법에 집중합니다.
